package pruebas;

import modelo.*;
import junit.framework.TestCase;

public class AutoTest extends TestCase {
	
	private Auto auto;
	private Jugador jugador;
	private Pista pista;
	private Carrera carrera;
	
	protected void setUp() throws Exception {
		super.setUp();
	}
	
	public void testCrear() throws InterruptedException{
		
		auto = new Auto(new Win32(), new Paler9());
		auto = new Auto(new Win32(), new Mess10());
		auto = new Auto(new Lin64(), new Paler9());
		auto = new Auto(new Lin64(), new Mess10());
		auto = new Auto(new MacX(), new Paler9());
		auto = new Auto(new MacX(), new Mess10());
	}
	
	public void testAuto_Win32_Paler9() throws InterruptedException{
		auto =  new Auto(new Win32(), new Paler9());
		jugador = new Jugador("alandex",auto);
		pista = new Pista(40,30,30);
		carrera = new Carrera(jugador, pista);
		assertSame(jugador, carrera.getJugador());
		assertSame(pista, carrera.getPista());
		assertTrue(carrera.estaPausada());
		assertFalse(carrera.termino());
		carrera.comenzar();
		Thread.sleep(200);
		jugador.getAuto().moverHaciaLaIzquierda();
		jugador.getAuto().moverHaciaLaIzquierda();
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertEquals(0, jugador.getAuto().getPosicionEnLargo());
		jugador.getAuto().acelerar();
		jugador.getAuto().moverHaciaLaIzquierda();
		Thread.sleep(100);
		carrera.finalizar();
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertFalse(carrera.gano());
	}
	
	public void testAuto_Win32_Mess10() throws InterruptedException{
		auto =  new Auto(new Win32(), new Mess10());
		jugador = new Jugador("alandex",auto);
		pista = new Pista(40,30,30);
		carrera = new Carrera(jugador, pista);
		assertSame(jugador, carrera.getJugador());
		assertSame(pista, carrera.getPista());
		assertTrue(carrera.estaPausada());
		assertFalse(carrera.termino());
		carrera.comenzar();
		Thread.sleep(200);
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertEquals(0, jugador.getAuto().getPosicionEnLargo());
		jugador.getAuto().acelerar();
		jugador.getAuto().moverHaciaLaIzquierda();
		jugador.getAuto().moverHaciaLaIzquierda();
		Thread.sleep(100);
		carrera.finalizar();
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertFalse(carrera.gano());
	}
	
	public void testAuto_Lin64_Paler9() throws InterruptedException{
		auto =  new Auto(new Lin64(), new Paler9());
		jugador = new Jugador("alandex",auto);
		pista = new Pista(40,30,30);
		carrera = new Carrera(jugador, pista);
		assertSame(jugador, carrera.getJugador());
		assertSame(pista, carrera.getPista());
		assertTrue(carrera.estaPausada());
		assertFalse(carrera.termino());
		carrera.comenzar();
		Thread.sleep(200);
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertEquals(0, jugador.getAuto().getPosicionEnLargo());
		jugador.getAuto().acelerar();
		jugador.getAuto().moverHaciaLaIzquierda();
		jugador.getAuto().moverHaciaLaDerecha();
		jugador.getAuto().moverHaciaLaDerecha();
		Thread.sleep(100);
		carrera.finalizar();
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertFalse(carrera.gano());
	}
	
	public void testAuto_Lin64_Mess10() throws InterruptedException{
		auto =  new Auto(new Lin64(), new Mess10());
		jugador = new Jugador("alandex",auto);
		pista = new Pista(40,30,30);
		carrera = new Carrera(jugador, pista);
		assertSame(jugador, carrera.getJugador());
		assertSame(pista, carrera.getPista());
		assertTrue(carrera.estaPausada());
		assertFalse(carrera.termino());
		carrera.comenzar();
		Thread.sleep(200);
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertEquals(0, jugador.getAuto().getPosicionEnLargo());
		jugador.getAuto().acelerar();
		jugador.getAuto().moverHaciaLaIzquierda();
		Thread.sleep(100);
		carrera.finalizar();
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertFalse(carrera.gano());
	}
	
	public void testAuto_MacX_Paler9() throws InterruptedException{
		auto =  new Auto(new MacX(), new Paler9());
		jugador = new Jugador("alandex",auto);
		pista = new Pista(40,30,30);
		carrera = new Carrera(jugador, pista);
		assertSame(jugador, carrera.getJugador());
		assertSame(pista, carrera.getPista());
		assertTrue(carrera.estaPausada());
		assertFalse(carrera.termino());
		carrera.comenzar();
		Thread.sleep(200);
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertEquals(0, jugador.getAuto().getPosicionEnLargo());
		jugador.getAuto().acelerar();
		jugador.getAuto().moverHaciaLaIzquierda();
		Thread.sleep(100);
		carrera.finalizar();
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertFalse(carrera.gano());
	}
	
	public void testAuto_MacX_Mess10() throws InterruptedException{
		auto =  new Auto(new MacX(), new Mess10());
		jugador = new Jugador("alandex",auto);
		pista = new Pista(40,30,30);
		carrera = new Carrera(jugador, pista);
		assertSame(jugador, carrera.getJugador());
		assertSame(pista, carrera.getPista());
		assertTrue(carrera.estaPausada());
		assertFalse(carrera.termino());
		carrera.comenzar();
		Thread.sleep(200);
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertEquals(0, jugador.getAuto().getPosicionEnLargo());
		jugador.getAuto().acelerar();
		jugador.getAuto().moverHaciaLaIzquierda();
		Thread.sleep(100);
		carrera.finalizar();
		assertEquals(2, jugador.getAuto().getPosicionEnAncho());
		assertFalse(carrera.gano());
	}
	
	public void testMantenerVelocidad() throws InterruptedException{
		auto =  new Auto(new MacX(), new Mess10());
		jugador = new Jugador("alandex",auto);
		pista = new Pista(40,30,30);
		carrera = new Carrera(jugador, pista);
		carrera.comenzar();
		jugador.getAuto().acelerar();
		Thread.sleep(200);
		
		jugador.getAuto().mantenerVelocidad();
		double velocidad = jugador.getAuto().getVelocidad();
		int posicion = jugador.getAuto().getPosicionEnLargo();
		long tiempo = Cronometro.getInstance().getTiempo();
		
		Thread.sleep(500);
		assertTrue(velocidad == jugador.getAuto().getVelocidad());
		assertTrue(posicion != jugador.getAuto().getPosicionEnLargo());
		assertTrue(tiempo != Cronometro.getInstance().getTiempo());
		carrera.finalizar();
		assertFalse(carrera.gano());
	}
	
	public void testFrenar() throws InterruptedException{
		auto =  new Auto(new MacX(), new Mess10());
		jugador = new Jugador("alandex",auto);
		pista = new Pista(40,30,30);
		carrera = new Carrera(jugador, pista);
		carrera.comenzar();
		jugador.getAuto().acelerar();
		Thread.sleep(200);
		jugador.getAuto().frenar();
		Thread.sleep(300);
		assertTrue(0 == jugador.getAuto().getVelocidad());
		carrera.finalizar();
		assertFalse(carrera.gano());
	}

}


